/*
*********************************************************************************************************
*
*	模块名称 : BSP模块
*	文件名称 : bsp.c
*	版    本 : V1.1
*	说    明 : 这是硬件底层驱动程序模块的主文件。主要提供 bsp_Init()函数供主程序调用。主程序的每个c文件
*			可以在开头添加 #include "bsp.h" 来包含所有的外设驱动模块。
*
*
*********************************************************************************************************
*/

#include "bsp.h"
#include "LL_Gui.h"

void PWM_gpio_remap(void)
{
    //PD13  PD14 PD15 are needed to remap to TIM4
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	
    GPIO_PinRemapConfig(GPIO_Remap_TIM4 , ENABLE);

}
void DebugUartInit(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_USART2 , ENABLE);	//PD5  PD6 remap to USART2

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);    
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // TX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;     // Rx
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
    GPIO_Init(GPIOD, &GPIO_InitStructure); 
    

    USART_InitStructure.USART_BaudRate = 115200;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 
    USART_InitStructure.USART_Parity = USART_Parity_No; // 
    USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8
    USART_Init(USART2, &USART_InitStructure);
    
	USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);  
    USART_Cmd(USART2, ENABLE);
}

void JQ8900UartInit(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); 
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; // TX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;     // Rx
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        
    GPIO_Init(GPIOD, &GPIO_InitStructure);    

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 
    USART_InitStructure.USART_Parity = USART_Parity_No; // 
    USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8
    USART_Init(UART5, &USART_InitStructure);
    
	USART_ITConfig(UART5, USART_IT_RXNE, DISABLE);  
    USART_Cmd(UART5, ENABLE);
}

void UartSendToJQ8900(u8 * ptr, u8 len)
{
    	/* 等待发送结束 */
    while(len--){
    	while (USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET)	{}
        USART_SendData(UART5, *ptr++);
    }

}

void Oled_Lcd_RST(void)
{    
    GPIO_InitTypeDef GPIO_InitStructure;
	/* 打开GPIO时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	/* 推挽输出模式 */	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
    
	OLED_RST_CLR();
	bsp_DelayMS(100);
	OLED_RST_SET();
}
/*
*********************************************************************************************************
*	函 数 名: bsp_Init
*	功能说明: 初始化硬件设备。上电只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
*			 全局变量。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_Init(void)
{
	/*
		由于ST固件库的启动文件已经执行了CPU系统时钟的初始化，所以不必再次重复配置系统时钟。
		启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。

		系统时钟缺省配置为72MHz，如果需要更改，可以修改 system_stm32f10x.c 文件
	*/

	/* 中断优先级分组设置为4，即： 抢占优先级有0-15(0级别最高）级，无子优先级 */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    PWM_gpio_remap();
    
	DebugUartInit();  //debug uart for printf
    JQ8900UartInit();
//	bsp_InitUart(); 	/* 初始化串口 */
	bsp_InitLed(); 		/* 初始化LED指示灯端口 */
	bsp_InitKey();		/* 初始化按键 */
    
    
    //seg_dz_GPIOInit();
    
    
	//bsp_InitRTC();		/* 初始化CPU内部RTC */	
    BEEP_InitHard();

	bsp_InitI2C();		/* 配置I2C总线 */
	
	bsp_InitSPIBus();	/* 配置SPI总线，必须在初始化串行Flash之前执行本函数 */	
	bsp_InitTimer();	/* 初始化系统滴答定时器 (此函数会开中断) */	
    Oled_Lcd_RST();
}

/*
*********************************************************************************************************
*	函 数 名: fputc
*	功能说明: 重定义putc函数，这样可以使用printf函数从串口1打印输出
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
int stdout_putchar(int ch, FILE *f)
{	
	/* 等待发送结束 */
	while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)	{}
	USART_SendData(USART2, (uint8_t) ch);
	return ch;

}

/*
*********************************************************************************************************
*	函 数 名: bsp_RunPer10ms
*	功能说明: 该函数每隔10ms被Systick中断调用1次。详见 bsp_timer.c的定时中断服务程序。一些处理时间要求不严格的
*			任务可以放在此函数。比如：按键扫描、蜂鸣器鸣叫控制等。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_RunPer10ms(void)
{
	bsp_KeyScan();		/* 扫描按键 */
    AdcPro();	
	BEEP_Pro();			/* 处理蜂鸣器定时器 */
     llGuiTick(10);//10ms
}

/*
*********************************************************************************************************
*	函 数 名: bsp_RunPer1ms
*	功能说明: 该函数每隔1ms被Systick中断调用1次。详见 bsp_timer.c的定时中断服务程序。一些需要周期性处理的事务
*			 可以放在此函数。比如：触摸坐标扫描。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void bsp_RunPer1ms(void)
{
	//segFlash();
    
}

/*
*********************************************************************************************************
*	函 数 名: bsp_Idle
*	功能说明: CPU空闲时执行的函数。一般主程序在for和while循环程序体中调用本函数。不要在中断服务程序中调用。
*			 用户可以添加喂狗、设置CPU进入休眠模式的功能、也可以添加一些需要全局支持的功能，比如截屏。
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
extern void SaveScreenToBmp(uint16_t _index);	/* 此函数在user\app\bmp_file.c --- 调用用了应用层的函数 */
void bsp_Idle(void)
{
	/* --- 喂狗 */

	/* --- 让CPU进入休眠，由Systick定时中断唤醒或者其他中断唤醒 */

	/* 例如 emWin 图形库，可以插入图形库需要的轮询函数 */
	//GUI_Exec();

	/* 例如 uIP 协议，可以插入uip轮询函数 */

}

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
